優秀的軟體開發者能理解箇中原因,在不帶有偏頗的情況下,選擇最適合的方法來完成手中的工作。
物件與資料結構兩種模式,各具優點並彼此互補,在這篇中將會提到他們各自的優點與缺點。
public class Square implement Shape {
private Point topLeft;
private double side;
public double area() {
return side * side;
}
}
public class Rectangle implement Shape {
private Point topLeft;
private double height;
private double width;
public double area() {
return height * width;
}
}
public class Circle implement Shape {
private Point center;
private double radius;
public final double PI = 3.141592653589793;
public double area() {
return PI * radius * radius;
}
}
在上面的程式碼中我們可以很輕易地發現,物件導向的程式碼,容易添加新類別,而不需修改已有的函式。但相反的,物件導向的程式碼很難添加新的函式,因為這將必須改變所有類別。
那結構化的程式碼 (使用資料結構的程式碼) 呢?
public class Square {
private Point topLeft;
private double side;
}
public class Rectangle {
private Point topLeft;
private double height;
private double width;
}
public class Circle {
private Point center;
private double radius;
}
public class Geometry {
public final double PI = 3.141592653589793;
public double area(Object shape) throws NoSuchShapeException {
if (shape instanceof Square) {
Square s = (Square)shape;
return s.side * s.side;
}
else if (shape instanceof Rectangle) {
Rectangle r = (Rectangle)shape;
return r.height * r.width;
}
else if (shape instanceof Circle) {
Circle c = (Circle)shape;
return PI * c.radius * c.radius;
}
throw new NoSuchShapeException();
}
}
與物件導向相對,使用資料結構的程式碼容易添加新的函式,而不需要變動舊有的程式碼。與此同時,它難以添加新的資料結構,因為這必須更改所有函式。
物件及資料結構在本質上,對立且互補。使用物件導向感到困難的事物,在結構化裡卻很容易;在結構化中感到困難的,在物件導向中卻輕而易舉。
在任何複雜的系統裡,總是有想要增加新資料型態,而非增加新函式的時候。在這種情況下,物件和物件導向是最適合的。在另一方面,也會有想增加新函式,而非增加新資料型態的時候,在這種情況下,結構化和資料結構式較為合適的。
成熟的程式設計師知道一個概念,要讓每件事物都是一個物件是一個神話。某些時候,你真的只想使用簡單的資料結構,並透過結構式的程式碼來操作這些資料結構。
......他們擁有函式來做一些重要的事,它們也有公共變數或公共存取器、修改器,......像這般的混合體,會使得程式難以添加新的函式,同時,也難以添加新的資料結構。
將物件導向及結構化程式混合在一起,是兩種世界裡最糟糕的情況,並代表作者不確定這個系統該如何設計。
大概是對於物件導向設計模式的不嫻熟,其實我對於這篇該如何應用、提升自己的程式碼品質是有點茫然的,但還是分享給大家做參考。只好期待之後我更理解 OOP 概念後,重讀這篇章會有全新的收穫哩!